package cn.fuxi2022.rabbitmq.appletsPay.config;

import cn.fuxi2022.rabbitmq.appletsPay.constants.ActivityConstants;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

/**
 * 活动MQ配置
 */
@Configuration
public class ActivityRabbitMQConfig {

    /**
     * 活动超时交换机
     */
    @Bean
    public FanoutExchange activityTtlExchange() {
        // 持久化打开+自动删除关闭
        return new FanoutExchange(ActivityConstants.GROUP_ACTIVITY_TTL_EXCHANGE, true, false);
    }

    /**
     * 活动超时交换机 的 活动超时队列
     */
    @Bean
    public Queue activityTtlQueue() {
        // 创建队列参数
        HashMap<String, Object> map = new HashMap<>();
        // 消息的生存时间（15分钟检查一次活动是否过期）
        map.put("x-message-ttl", 900000);
        // 超过订单的生产时间，要求不要丢掉消息消息，而是进入死信队列
        map.put("x-dead-letter-exchange", ActivityConstants.GROUP_ACTIVITY_DLE_EXCHANGE);
        // 打开队列持久化 + 排他队列 + 自动删除关闭
        return new Queue(ActivityConstants.GROUP_ACTIVITY_TTL_ACTIVITY_QUEUE, true, false, false, map);
    }

    /**
     * 活动超时队列 绑定 活动超时交换机
     */
    @Bean
    public Binding activityToTtlExchange() {
        return BindingBuilder.bind(activityTtlQueue()).to(activityTtlExchange());
    }

    // ----------------------------------------------------------------

    /**
     * 活动死信交换机
     */
    @Bean
    public FanoutExchange activityDleExchange() {
        // 持久化打开+自动删除关闭
        return new FanoutExchange(ActivityConstants.GROUP_ACTIVITY_DLE_EXCHANGE, true, false);
    }

    /**
     * 活动死信交换机 的 活动死信队列
     */
    @Bean
    public Queue activityDleQueue() {
        return new Queue(ActivityConstants.GROUP_ACTIVITY_DLE_ACTIVITY_QUEUE);
    }

    /**
     * 订单超时队列 绑定 订单超时交换机
     */
    @Bean
    public Binding activityToDleExchange() {
        return BindingBuilder.bind(activityDleQueue()).to(activityDleExchange());
    }
}
